#include <stdio.h>
#include <stdlib.h>
#include "bst.h"

// 比较函数：用于比较两个整数
int cmp_int(const void *data, const void *key)
{
    int a = *(int *)data;
    int b = *(int *)key;
    return a - b;
}

// 打印函数：用于中序遍历时打印数据
void print_int(const void *data)
{
    printf("%d ", *(int *)data);
}

int main()
{
    bst_t *tree = NULL;
    int data[] = {5, 3, 7, 2, 4, 6, 8};  // 测试数据
    int key, i;
    void *result;

    // 1. 测试树的初始化
    printf("测试树的初始化...\n");
    if (bst_init(&tree, sizeof(int), cmp_int) != 0) {
        printf("初始化失败！\n");
        return 1;
    }
    printf("初始化成功！\n\n");

    // 2. 测试插入数据
    printf("测试插入数据...\n");
    for (i = 0; i < sizeof(data) / sizeof(data[0]); i++) {
        if (bst_insert(tree, &data[i]) != 0) {
            printf("插入数据 %d 失败！\n", data[i]);
        } else {
            printf("插入数据 %d 成功！\n", data[i]);
        }
    }
    printf("插入数据测试完成！\n\n");

    // 3. 测试获取树的大小
    printf("测试获取树的大小...\n");
    printf("当前树的大小：%zu\n", bst_size(tree));
    printf("获取树的大小测试完成！\n\n");

    // 4. 测试查找数据
    printf("测试查找数据...\n");
    key = 4;
    result = bst_search(tree, &key);
    if (result != NULL) {
        printf("找到数据 %d！\n", *(int *)result);
    } else {
        printf("未找到数据 %d！\n", key);
    }

    key = 10;
    result = bst_search(tree, &key);
    if (result != NULL) {
        printf("找到数据 %d！\n", *(int *)result);
    } else {
        printf("未找到数据 %d！\n", key);
    }
    printf("查找数据测试完成！\n\n");

    // 5. 测试中序遍历
    printf("测试中序遍历...\n");
    printf("中序遍历结果：");
    bst_inorder(tree, print_int);
    printf("\n中序遍历测试完成！\n\n");

    // 6. 测试删除数据
    printf("测试删除数据...\n");
    key = 3;
    if (bst_delete(tree, &key) != 0) {
        printf("删除数据 %d 失败！\n", key);
    } else {
        printf("删除数据 %d 成功！\n", key);
    }

    key = 10;
    if (bst_delete(tree, &key) != 0) {
        printf("删除数据 %d 失败！\n", key);
    } else {
        printf("删除数据 %d 成功！\n", key);
    }
    printf("删除数据测试完成！\n\n");

    // 7. 测试删除后的中序遍历
    printf("测试删除后的中序遍历...\n");
    printf("中序遍历结果：");
    bst_inorder(tree, print_int);
    printf("\n删除后的中序遍历测试完成！\n\n");

    // 8. 测试清空树
    printf("测试清空树...\n");
    bst_clear(tree);
    printf("清空树后的大小：%zu\n", bst_size(tree));
    printf("清空树测试完成！\n\n");

    // 9. 测试销毁树
    printf("测试销毁树...\n");
    bst_destroy(&tree);
    if (tree == NULL) {
        printf("销毁树成功！\n");
    } else {
        printf("销毁树失败！\n");
    }
    printf("销毁树测试完成！\n\n");

    return 0;
}
